// ====================PluginParameters====================

/*:
 * @target MZ
 * @plugindesc [v0.10]        杀戮尖塔like卡牌系统-早期开发版
 * @author sundeshuo
 * @url https://pd.qq.com/s/5i0mkwrov
 *
 * @command Card Game Setup
 * @text 卡牌战斗
 * @desc 开始一场卡牌战斗
 *
 * @arg Index
 * @text 敌群ID
 * @type number
 * @desc 设定怪物群组的ID，使用的是rm数据库-敌群
 * @default 0
 *
 * @arg Reward Gold
 * @text 金币
 * @type number
 * @desc 设置战斗胜利后获得的金币数量
 * @default 0
 *
 * @param UI Layout
 * @text =====UI布局=====
 *
 * @param Card Layout
 * @text 卡牌布局
 * @parent UI Layout
 * @type struct<CardLayout>
 * @desc 设置卡牌布局参数,卡牌的锚点为底部中心位置
 * @default {"Card Scale X":"1","Card Scale Y":"1","Highlighter Layer File":"CardOverlay","Card Face Layer File":"Card","Highlighter Layer Deviation X":"0","Highlighter Layer Deviation Y":"-19","Card Name Area":"{\"x\":\"10\",\"y\":\"171\",\"width\":\"180\",\"height\":\"24\"}","Card Image Area":"{\"x\":\"40\",\"y\":\"15\",\"width\":\"120\",\"height\":\"120\"}","Card Cost Area":"{\"x\":\"20\",\"y\":\"150\",\"width\":\"160\",\"height\":\"20\"}","Card Describe Area":"{\"x\":\"15\",\"y\":\"202\",\"width\":\"170\",\"height\":\"70\"}","Card Type Area":"{\"x\":\"15\",\"y\":\"272\",\"width\":\"170\",\"height\":\"15\"}"}
 *
 * @param Game UI
 * @text 局内UI
 * @parent UI Layout
 * @type struct<GameUI>
 * @desc 设置卡牌对局中的UI布局参数
 *
 * @param Display Window
 * @text 卡牌展示窗口
 * @parent UI Layout
 * @type struct<DisplayWindow>
 * @desc 设置卡牌展示窗口的布局参数
 *
 * @param Game Option
 * @text 对局选项
 * @type struct<GameOption>
 * @desc 设置卡牌游戏中对局相关参数
 * @default {"Max Energy":"4","Turn Recovery Energy":"4","Hand Card Limit":"10","Start Hand Card":"0","Turn Draw Card":"5","Turn End Abandon Card":"true"}
 *
 * @help
 * ============================================================================
 * 前置插件：
 * GF_0_CoreOfGame.js
 *
 * API：
 * 设置卡组:
 * 卡组是一个数组[卡牌ID1,卡牌ID2,卡牌ID3,...]
 * $gameParty.setDeck(卡组);
 * 获取当前游戏中的手牌数量：
 * CardGameManager.handCardAmount();
 *
 * 职业注释:
 * -卡组-
 * 设置该职业的所有卡牌,战斗胜利后的卡牌随机选择会在自身职业的卡组内随机生成
 * <卡组:卡牌id1,卡牌id2,卡牌id3,...>
 *
 * 技能注释:
 *
 * -卡牌图像-
 * 如果注释存在，会只用img/card文件夹下的同名文件;注释不存在则使用技能图标;
 * <卡牌图像:文件名>
 *
 * -回复护甲-
 * 该效果与卡牌效果中的护甲会重复执行，此词条主要是为了给怪物技能设置回甲效果;
 * <卡牌护甲:护甲值>
 *
 * -卡牌类型-
 * 如果注释存在，会为卡牌设置类型，可以用与定向检索等功能;
 * <卡牌类型:类型1,类型2,...>
 *
 * -卡牌使用条件-
 * 如果注释存在，只有瞒住条件的卡牌才可以使用;
 * 可以配合API填写自定义代码;
 * 需要注意的是,填写的代码请返回布尔值,否则不会产生效果;
 * <卡牌条件:code>
 *
 * -卡牌效果-
 * 如果注释存在，会按照注释顺序表执行卡牌效果;注释不存在则只会发动技能;
 * 注意!这些效果不会对怪物释放的技能生效；
 * 例:
 * <卡牌效果>
 * 过牌:2
 * 行动
 * 能量:1
 * </卡牌效果>
 *
 * -效果列表-
 * 0.<行动>执行对应的技能
 * 行动
 *
 * 0.1 <等待> 等待对应的帧数
 * 等待:帧数
 *
 * 1.<过牌>从牌库抽n张牌
 * 过牌:数量
 *
 * 2.<能量>获得或扣除能量
 * 能量:值
 *
 * 3.<护甲>获得或扣除护甲
 * 护甲:值
 *
 * 4.<检索>从牌库或墓地抽取n张xx类型的牌
 * 检索:数量,类型,牌库/墓地
 *
 * 5.<发现>从牌库或墓地展示n张牌,选择其中1张放入手牌
 * 发现:数量,类型,牌库/墓地
 *
 * 6.<弃牌>从牌库或手牌中弃置n张xx类型的牌
 * 弃牌:数量,类型,牌库/手牌
 *
 * 7.<抉择>选择一张手牌放置到牌库顶或弃置该牌或消耗
 * 抉择:弃牌/牌库顶/牌库随机/牌库底/消耗
 *
 * 更多效果制作中,敬请期待
 *
 * -状态-
 * 再<战斗开始><回合开始><抽牌前><出牌后><回合结束><战斗结束>时间节点执行你的自定义代码
 * 制作中,敬请期待
 *
 *
 */
/*~struct~GameOption:
 *
 * @param Card Battler
 * @text 卡牌战斗角色
 * @type actor
 * @desc 设置卡牌战斗角色，用于卡牌战斗中，所使用的角色；
 * @default 1
 *
 * @param Max Energy
 * @text 最大能量
 * @type number
 * @desc 卡牌对局中的能量上限
 * @default 4
 *
 * @param Turn Recovery Energy
 * @text 能量回复
 * @type number
 * @desc 卡牌对局中，新的回合开始时，能量重置到的值；注意，这里如果上个回合能量没有用完不会累加
 * @default 4
 *
 * @param Hand Card Limit
 * @text 手牌上限
 * @type number
 * @desc 卡牌游戏中，玩家最多可以持有多少张牌
 * @default 10
 *
 * @param Start Hand Card
 * @text 初始手牌
 * @type number
 * @desc 卡牌游戏中，玩家初始拥有多少张牌；
 * @default 0
 *
 * @param Turn Draw Card
 * @text 回合抽卡
 * @type number
 * @desc 卡牌游戏中，新的回合开始时，从卡牌库中抽卡的数量；
 * @default 5
 *
 * @param Turn End Abandon Card
 * @text 回合弃牌
 * @type boolean
 * @on 弃牌
 * @off 不弃牌
 * @desc 是否在回合结束时弃置所有手牌；
 * @default true
 */
/*~struct~CardLayout:
 *
 * @param Card Scale X
 * @text 缩放x
 * @type number
 * @desc 卡牌x轴整体缩放
 * @default 1
 *
 * @param Card Scale Y
 * @text 缩放y
 * @type number
 * @desc 卡牌y轴整体缩放
 * @default 1
 *
 * @param Highlighter Layer File
 * @text 高亮层图像文件
 * @type file
 * @dir img/system/
 * @desc 设置你的素材文件
 * @default "CardOverlay"
 *
 * @param Card Face Layer File
 * @text 卡面图像文件
 * @type file
 * @dir img/system/
 * @desc 设置你的素材文件
 * @default "card"
 *
 * @param Highlighter Layer Deviation X
 * @text 高亮层图像偏移量x
 * @type int
 * @desc 如果你的素材图像尺寸不一致，则可以调整此参数，卡面相对于高光层右为负，左为正
 * @default 0
 *
 * @param Highlighter Layer Deviation Y
 * @text 高亮层图像偏移量y
 * @type int
 * @desc 如果你的素材图像尺寸不一致，则可以调整此参数，卡面相对于高光层上为负，下为正
 * @default -19
 *
 * @param Card Name Area
 * @text 名称区域
 * @type struct<Area>
 * @desc 绘制卡牌名字的区域范围，相对于卡牌
 * @default {"x":"10","y":"171","width":"180","height":"24"}
 *
 * @param Card Image Area
 * @text 图像区域
 * @type struct<Area>
 * @desc 绘制卡牌图像的区域范围，相对于卡牌
 * @default {"x":"40","y":"15","width":"120","height":"120"}
 *
 * @param Card Cost Area
 * @text 费用区域
 * @type struct<Area>
 * @desc 绘制卡牌费用的区域范围，相对于卡牌
 * @default {"x":"20","y":"150","width":"160","height":"20"}
 *
 * @param Card Describe Area
 * @text 描述区域
 * @type struct<Area>
 * @desc 绘制卡牌说明的区域范围，相对于卡牌
 * @default {"x":"15","y":"202","width":"170","height":"70"}
 *
 * @param Card Type Area
 * @text 类型区域
 * @type struct<Area>
 * @desc 绘制卡牌类型的区域范围，相对于卡牌
 * @default {"x":"15","y":"272","width":"170","height":"15"}
 *
 */
/*~struct~GameUI:
 *
 * @param State Panel
 * @text =====状态面板(暂无用)=====
 *
 * @param State Panel Area
 * @text 状态面板区域
 * @parent State Panel
 * @type struct<Area>
 * @desc 状态面板的整体布局位置
 * @default {"x":"0","y":"0","width":"1440","height":"580"}
 *
 * @param Background File
 * @text 背景图像文件
 * @parent State Panel
 * @type file
 * @dir img/system/
 * @desc 状态面板背景的图像文件，如果为空则默认使用代码绘制简单的背景；
 * @default
 *
 * @param Face Area
 * @text 头像区域
 * @parent State Panel
 * @type struct<Area>
 * @desc 状态面板头像区域的大小、位置；
 * @default {"x":"5","y":"10","width":"160","height":"160"}
 *
 * @param Hand Card Area
 * @text 手牌区域
 * @type struct<Area>
 * @desc 手牌区域的大小、位置；
 * @default {"x":"360","y":"600","width":"720","height":"300"}
 *
 * @param Effect Area
 * @text 效果区域
 * @type struct<Area>
 * @desc 显示卡牌选择一类事件的区域；
 * @default {"x":"360","y":"150","width":"720","height":"300"}
 *
 * @param Deck
 * @text =====牌库=====
 *
 * @param Deck File
 * @text 牌库图像文件
 * @parent Deck
 * @type file
 * @dir img/system/
 * @desc 卡背图像文件;
 * @default "CardBack"
 *
 * @param Deck Font Size
 * @text 牌库字体大小
 * @parent Deck
 * @type number
 * @desc 显示在牌堆上的剩余卡牌数字的大小
 * @default 28
 *
 * @param Deck Icon Size
 * @text 牌库图标大小
 * @parent Deck
 * @type number
 * @desc 显示在牌堆上牌库类型（牌库、墓地）的图标大小，长宽相等;
 * @default 50
 *
 * @param Deck Area
 * @text 牌库区域
 * @parent Deck
 * @type struct<Area>
 * @desc 牌库的位置和大小;
 * @default {"x":"10","y":"635","width":"100","height":"150"}
 *
 * @param Deck Icon Index
 * @text 牌库图标索引
 * @parent Deck
 * @type number
 * @desc 显示在牌库图形，卡背上方的图标索引；
 * @default 186
 *
 * @param Cemetery Area
 * @text 墓地区域
 * @parent Deck
 * @type struct<Area>
 * @desc 墓地的位置和大小;
 * @default {"x":"1330","y":"635","width":"100","height":"150"}
 *
 * @param Cemetery Icon Index
 * @text 墓地图标索引
 * @parent Deck
 * @type number
 * @desc 显示在牌库图形，卡背上方的图标索引；
 * @default 17
 *
 * @param Turn Button Area
 * @text 回合按钮区域
 * @type struct<Area>
 * @desc 回合结束按钮的位置与大小;
 * @default {"x":"1180","y":"740","width":"140","height":"40"}
 *
 * @param Card Energy Area
 * @text 能量区域
 * @type struct<Area>
 * @desc 能量区域的大小、位置;
 * @default {"x":"1180","y":"700","width":"140","height":"40"}
 *
 * @param Full Energy Icon Index
 * @text 满能量图标
 * @type icon
 * @desc 可以使用的能量图标的索引;
 * @default 164
 *
 * @param Empty Energy Icon Index
 * @text 空能量图标
 * @type icon
 * @desc 不可以使用的能量图标的索引;
 * @default 166
 */
/*~struct~DisplayWindow:
 * @param Window Area
 * @text 窗口区域
 * @type struct<Area>
 */
/*~struct~Area:
 * @param x
 * @text x
 * @type number
 * @desc 区域的x坐标
 * @default 0
 *
 * @param y
 * @text y
 * @type number
 * @desc 区域的y坐标
 * @default 0
 *
 * @param width
 * @text 宽
 * @type number
 * @desc 区域的宽
 * @default 100
 *
 * @param height
 * @text 高
 * @type number
 * @desc 区域的高
 * @default 100
 */

window.SDS_CARD_PLUGIN_PARAM ||= {};
window.SDS_CARD_COPY ||= {};

SDS_CARD_PLUGIN_PARAM.pluginName = document.currentScript.src.match(/([^\/]+)\.js/)[1];
SDS_CARD_PLUGIN_PARAM.Parameters = PluginManager.parameters(SDS_CARD_PLUGIN_PARAM.pluginName);
// 处理对局参数
(() => {
    const param = JSON.parse(SDS_CARD_PLUGIN_PARAM.Parameters["Game Option"]);
    const cardBattler = Number(param["Card Battler"]) || 1;
    const maxEnergy = Number(param["Max Energy"]) || 4;
    const energyRecovery = Number(param["Turn Recovery Energy"]) || 4;
    const maxHandCard = Number(param["Hand Card Limit"]) || 10;
    const startHandCardAmount = Number(param["Start Hand Card"]) || 0;
    const turnDrawCardAmount = Number(param["Turn Draw Card"]) || 5;
    const turnEndAbandonCard = param["Turn End Abandon Card"] === "true";
    SDS_CARD_PLUGIN_PARAM.gameOption = {
        cardBattler,
        maxEnergy,
        energyRecovery,
        maxHandCard,
        startHandCardAmount,
        turnDrawCardAmount,
        turnEndAbandonCard
    }
})();
// 处理卡牌布局参数
(() => {
    const param = JSON.parse(SDS_CARD_PLUGIN_PARAM.Parameters["Card Layout"]);
    const cardScaleX = Number(param["Card Scale X"]) || 1;
    const cardScaleY = Number(param["Card Scale Y"]) || 1;
    const highlighterLayerFile = param["Highlighter Layer File"] || "CardOverlay";
    const cardFaceLayerFile = param["Card Face Layer File"] || "card";
    const cardDeviationX = Number(param["Highlighter Layer Deviation X"]) || 0;
    const cardDeviationY = Number(param["Highlighter Layer Deviation Y"]) || 0;
    const nameArea = JSON.parse(param["Card Name Area"]);
    const imageArea = JSON.parse(param["Card Image Area"]);
    const costArea = JSON.parse(param["Card Cost Area"]);
    const describeArea = JSON.parse(param["Card Describe Area"]);
    const typeArea = JSON.parse(param["Card Type Area"]);
    const nameRect = new Rectangle(nameArea.x, nameArea.y, nameArea.width, nameArea.height);
    const imageRect = new Rectangle(imageArea.x, imageArea.y, imageArea.width, imageArea.height);
    const costRect = new Rectangle(costArea.x, costArea.y, costArea.width, costArea.height);
    const describeRect = new Rectangle(describeArea.x, describeArea.y, describeArea.width, describeArea.height);
    const typeRect = new Rectangle(typeArea.x, typeArea.y, typeArea.width, typeArea.height);
    SDS_CARD_PLUGIN_PARAM.cardLayout = {
        cardScaleX,
        cardScaleY,
        highlighterLayerFile,
        cardFaceLayerFile,
        cardDeviationX,
        cardDeviationY,
        nameRect,
        imageRect,
        costRect,
        describeRect,
        typeRect
    }
})();
// 处理局内UI参数
(() => {
    const param = JSON.parse(SDS_CARD_PLUGIN_PARAM.Parameters["Game UI"]);
    const statePanelArea = JSON.parse(param["State Panel Area"]);
    const panelRect = new Rectangle(statePanelArea.x, statePanelArea.y, statePanelArea.width, statePanelArea.height);
    const backgroundFile = param["Background File"] || "";
    const faceArea = JSON.parse(param["Face Area"]);
    const faceRect = new Rectangle(faceArea.x, faceArea.y, faceArea.width, faceArea.height);
    // =====分割线=====
    const handCardArea = JSON.parse(param["Hand Card Area"]);
    const handCardRect = new Rectangle(handCardArea.x, handCardArea.y, handCardArea.width, handCardArea.height);
    const effectArea = JSON.parse(param["Effect Area"]);
    const effectRect = new Rectangle(effectArea.x, effectArea.y, effectArea.width, effectArea.height);
    const deckFile = param["Deck File"] || "";
    const deckFontSize = Number(param["Deck Font Size"]) || 28;
    const deckIconSize = Number(param["Deck Icon Size"]) || 50;
    const deckArea = JSON.parse(param["Deck Area"]);
    const deckRect = new Rectangle(deckArea.x, deckArea.y, deckArea.width, deckArea.height);
    const deckIconIndex = Number(param["Deck Icon Index"]) || 0;
    const cemeteryArea = JSON.parse(param["Cemetery Area"]);
    const cemeteryRect = new Rectangle(cemeteryArea.x, cemeteryArea.y, cemeteryArea.width, cemeteryArea.height);
    const cemeteryIconIndex = Number(param["Cemetery Icon Index"]) || 0;
    const turnButtonArea = JSON.parse(param["Turn Button Area"]);
    const turnButtonRect = new Rectangle(turnButtonArea.x, turnButtonArea.y, turnButtonArea.width, turnButtonArea.height);
    const energyArea = JSON.parse(param["Card Energy Area"]);
    const energyRect = new Rectangle(energyArea.x, energyArea.y, energyArea.width, energyArea.height);
    const fullEnergyIconIndex = Number(param["Full Energy Icon Index"]) || 0;
    const emptyEnergyIconIndex = Number(param["Empty Energy Icon Index"]) || 0;
    SDS_CARD_PLUGIN_PARAM.gameUI = {
        panelRect,
        backgroundFile,
        faceRect,
        handCardRect,
        effectRect,
        deckFile,
        deckFontSize,
        deckIconSize,
        deckRect,
        deckIconIndex,
        cemeteryRect,
        cemeteryIconIndex,
        turnButtonRect,
        energyRect,
        fullEnergyIconIndex,
        emptyEnergyIconIndex
    };
})();
window.SDS_CARD_COPY ||= {};

// ===============插件指令===============
PluginManager.registerCommand(SDS_CARD_PLUGIN_PARAM.pluginName, "Card Game Setup", args => {
    const index = Number(args.Index);
    if (!index) {
        console.error("卡牌战斗插件指令参数错误");
        return;
    }
    $gameTroop.setup(index);
    CardGameManager.cardGameInit();
    SceneManager.push(Scene_CardGame);

});



